<?php
/*
832. 翻转图像
给定一个二进制矩阵 A，我们想先水平翻转图像，然后反转图像并返回结果。

水平翻转图片就是将图片的每一行都进行翻转，即逆序。例如，水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。

反转图片的意思是图片中的 0 全部被 1 替换， 1 全部被 0 替换。例如，反转 [0, 1, 1] 的结果是 [1, 0, 0]。

示例 1：
输入：[[1,1,0],[1,0,1],[0,0,0]]
输出：[[1,0,0],[0,1,0],[1,1,1]]
解释：首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]]；
     然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]

示例 2：
输入：[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出：[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释：首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]；
     然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]


提示：
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1

https://leetcode.cn/problems/flipping-an-image/

*/

$image = [[1, 1, 0],[1, 0, 1],[0, 0, 0],];
$image = [[1, 1, 0, 0],[1, 0, 0, 1], [0, 1, 1, 1],[1, 0, 1, 0]];
print_r((new Solution832())->flipAndInvertImage($image));

class Solution832
{
    function flipAndInvertImage($image)
    {
        $cols = count($image[0]);
        foreach ($image as &$line) {
            $i = 0;
            $j = $cols - 1;
            // 这里用<=来作为循环条件，奇数列的话中间一位交换不影响结果，但需要操作取反，
            while ($i <= $j) {
                echo "i = $i, j = $j" . PHP_EOL;
                // 交换
                $tmp = $line[$i];
                $line[$i] = $line[$j];
                $line[$j] = $tmp;
                // 取反 注意奇数列的情况
                $line[$i] = $line[$i] ^ 1;
                if ($i != $j) {
                    $line[$j] = $line[$j] ^ 1;
                }
                $i++;
                $j--;
            }
        }
        return $image;
    }
}
